home *** CD-ROM | disk | FTP | other *** search
/ Aminet 8 / Aminet 8 (1995)(GTI - Schatztruhe)[!][Oct 1995].iso / Aminet / mus / play / tracker_4_31.lzh / tracker / Amiga / server / smain.c < prev    next >
C/C++ Source or Header  |  1995-02-13  |  5KB  |  188 lines

  1. /* amiga/server/main.c */
  2.  
  3. /* sound server task management */
  4.  
  5. /* $Id: smain.c,v 1.8 1995/02/13 22:08:26 Espie Exp espie $
  6.  * $Log: smain.c,v $
  7.  * Revision 1.8  1995/02/13  22:08:26  Espie
  8.  * No boolean. Changed include path.
  9.  *
  10.  * Revision 1.7  1994/01/08  20:26:45  Espie
  11.  * Added pause gadget.
  12.  *
  13.  * Revision 1.6  1994/01/08  04:05:32  Espie
  14.  * Added geta4 for local data model.
  15.  *
  16.  * Revision 1.5  1994/01/07  15:58:17  Espie
  17.  * Semantics of TIME_WAIT has changed:
  18.  * we now input delays and the server computes what's needed.
  19.  * Makes Pause feasible !
  20.  *
  21.  * Revision 1.4  1994/01/05  14:56:02  Espie
  22.  * *** empty log message ***
  23.  *
  24.  * Revision 1.3  1994/01/05  04:35:23  Espie
  25.  * Suppressed old debug messages.
  26.  *
  27.  * Revision 1.2  1994/01/04  19:13:21  Espie
  28.  * Almost nothing.
  29.  *
  30.  * Revision 1.1  1994/01/04  15:45:37  Espie
  31.  * Initial revision
  32.  *
  33.  */
  34. #include <exec/nodes.h>
  35. #include <exec/memory.h>
  36. #include <proto/exec.h>
  37. #include <devices/audio.h>
  38. #ifdef EXTERNAL
  39. #include <stdio.h>
  40. #endif
  41.  
  42. #include "defs.h"
  43. #include "amiga/amiga.h"
  44. #include "amiga/server/server.h"
  45.  
  46. ID("$Id: smain.c,v 1.8 1995/02/13 22:08:26 Espie Exp espie $")
  47.  
  48. LOCAL struct MsgPort *port = 0;
  49. LOCAL struct MinList event_list;
  50.  
  51. void close_all()
  52.    {
  53.    end_audio();
  54.    close_timer();
  55.    if (port)
  56.       {
  57.       struct Message *msg;
  58.       
  59.       while (msg = GetMsg(port))
  60.          ReplyMsg(msg);
  61.       while (msg = RemHead(&event_list))
  62.          ReplyMsg(msg);
  63.       if (port->mp_Node.ln_Name)
  64.          RemPort(port);
  65.       DeleteMsgPort(port);
  66.       }
  67.    }
  68.  
  69. void subtask(struct ext_message *msg)
  70.    {
  71.    struct MsgPort *aport, *tport;
  72.    struct ext_message *msg2;
  73.    int paused = FALSE;
  74.  
  75.    geta4();
  76.    msg->data.comm.task = FindTask(0);
  77.    msg->data.comm.port = 0;
  78.    if (!port)
  79.       port = CreateMsgPort();
  80.    NewList(&event_list);
  81.    aport = start_audio();
  82.    tport = open_timer();
  83.  
  84.    if (port && aport && tport)
  85.       {
  86.       msg->data.comm.port = port;
  87.       ReplyMsg(msg);
  88.       }
  89.    else
  90.       {
  91.       close_all();
  92.       Forbid();
  93.       ReplyMsg(msg);
  94. #ifdef EXTERNAL
  95.       return;
  96. #else
  97.       Wait(0L);
  98. #endif
  99.       }
  100.  
  101.    forever
  102.       {
  103.       ULONG mask;
  104.       
  105.       mask = Wait(1<<port->mp_SigBit | 1<<tport->mp_SigBit | 1<<aport->mp_SigBit);
  106.          /* deal with messages */
  107.       if (mask & 1<<port->mp_SigBit)
  108.          {
  109.  
  110.          while (msg = (struct ext_message *)GetMsg(port))
  111.             {
  112.             switch(msg->type)
  113.                {
  114.             case TYPE_DIE:
  115. #ifdef EXTERNAL
  116.                puts("Dying");
  117. #endif
  118.                close_all();
  119.                Forbid();
  120.                msg->data.comm.task = FindTask(0);
  121.                ReplyMsg(msg);
  122. #ifdef EXTERNAL
  123.                puts("Dead");
  124.                return;
  125. #else
  126.                Wait(0);
  127. #endif
  128.             case TYPE_FLUSH_BUFFER:
  129.                reset_audio();
  130.                ReplyMsg(msg);
  131.                while(msg = RemHead(&event_list))
  132.                   {
  133.                   ReplyMsg(msg);
  134.                   }
  135.                break;
  136.             case TYPE_PAUSE:
  137.                paused = TRUE;
  138.                ReplyMsg(msg);
  139.                send_immediate(CMD_STOP, 15);
  140.                break;
  141.             case TYPE_UNPAUSE:
  142.                paused = FALSE;
  143.                send_immediate(CMD_START, 15);
  144.                handle_timer(&event_list, TRUE);
  145.                ReplyMsg(msg);
  146.                break;
  147.                /* bandwidth optimization: compress multiple WAIT messages 
  148.                 * and reply them right away
  149.                 */
  150.             case TYPE_WAIT:
  151.                if (msg2 = RemTail(&event_list))
  152.                   {
  153.                   if (msg2->type == TYPE_WAIT)
  154.                      {
  155.                      msg->data.time.low += msg2->data.time.low;
  156.                      if (msg->data.time.low < msg2->data.time.low)
  157.                         msg->data.time.high++;
  158.                      msg->data.time.high += msg2->data.time.high;
  159.                      ReplyMsg(msg2);
  160.                      }
  161.                   else
  162.                      AddTail(&event_list, msg2);
  163.                   }
  164.                /* FALL THROUGH */
  165.             default:
  166.                AddTail(&event_list, msg);
  167.                }
  168.             }
  169.          }
  170.       if (!paused)
  171.          handle_timer(&event_list, mask & 1<<tport->mp_SigBit);
  172.       handle_audio(&event_list, mask & 1<<aport->mp_SigBit);
  173.       }
  174.    }
  175.  
  176. #ifdef EXTERNAL
  177. main()
  178.    {
  179.    port = CreateMsgPort();
  180.    port->mp_Node.ln_Name = PUBLIC_PORT_NAME;
  181.    port->mp_Node.ln_Pri = 0;
  182.    AddPort(port);
  183.    WaitPort(port);
  184.    subtask(GetMsg(port));
  185.    Permit();
  186.    }
  187. #endif
  188.